﻿#include <iostream>
#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;


void doCanny(int, void* userdata)
{
    Mat img_gaussian = *(Mat*)(userdata);
    Mat img_result;
    int position = getTrackbarPos("CannyBar", "Canny");

    //double类型的threshold1，第一个滞后性阈值【低阈值】。值越大，找到的边缘越少
    //double类型的threshold2，第二个滞后性阈值【高阈值】。
    //int类型的apertureSize，表示应用Sobel算子的孔径大小，其有默认值3。
    //bool类型的L2gradient，一个计算图像梯度幅值的标识，有默认值false。

    cv::Canny(img_gaussian, img_result, position, position * 2.5, 3);//threshold1 > 290 啥都看不到了
    cv::imshow("canny", img_result);
}

int main()
{
    std::cout << "test_canny\n";
    cv::Mat img_org = cv::imread(".\\lena.jpg");
    cv::Mat img_gaussian;
    cv::Mat img_gray;
    int bar_value = 1;

    cvtColor(img_org, img_gray, CV_BGR2GRAY);
    GaussianBlur(img_gray, img_gaussian, Size(3, 3), 0, 0);
    
    //cv::imshow("gray&gaussian", img_gaussian);
    
    namedWindow("Canny");

    //形式参数一、trackbarname：滑动空间的名称；
    //形式参数二、winname：滑动空间用于依附的图像窗口的名称；
    //形式参数三、value：初始化阈值；
    //形式参数四、count：滑动控件的刻度范围；
    //形式参数五、TrackbarCallback是回调函数，其定义如下：
    //typedef void (CV_CDECL* TrackbarCallback)(int pos, void* userdata);
    cv::createTrackbar("CannyBar", "Canny", &bar_value, 400, doCanny, &img_gaussian);

    cv::waitKey(0);
    return 0;
}